home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy004 / files / articulo.005 < prev    next >
Encoding:
Text File  |  1997-06-07  |  5.4 KB  |  130 lines

  1. *cX   Low Level. Player de ficheros de Ondas
  2.  
  3. *cR  Seguro que alguna  vez  te  has  preguntado
  4. como podia un PC reproducir las voces  y  los
  5. sonidos como si fuera una  grabadora.  Yo  no
  6. voy a contestarte esa pregunta (si todavia no 
  7. lo sabes) en este artículo, pero  lo  que  sí
  8. haré será mostrarte como programar  un repro-
  9. ductor de ondas para la Sound Blaster. Supon-
  10. go que ya teneis un mínimo conocimiento de la 
  11. tarjeta, de lo que es un fichero RAW de ondas 
  12. y, por supuesto, de ensamblador. Un player de 
  13. estas características  puede  programarse  de
  14. varias formas, pero hoy solo  veremos  las  2
  15. más usuales en C y assembler.
  16.  
  17. *cV        Player mediante pooling
  18. *cR
  19.  La primera forma y más sencilla, no requiere 
  20. el uso del DMA, simplemente se reprograma  el
  21. "timer" para que genere X interrupciones  por
  22. segundo, donde X es la velocidad de sampleado 
  23. que se usó al grabar la muestra  (normalmente
  24. 11025, 22050 o 44100). A  más  interrupciones
  25. por segundo mayor calidad, pero también menos 
  26. velocidad del ordenador (por lo  que  en  una
  27. demo o juego no se puede usar).  En  realidad
  28. este sistema sólo se usa en  programas  donde
  29. se va reproduciendo un sample cada  intervalo
  30. largo de tiempo a  petición  del  usuario,  y
  31. donde no pasa nada si  el  sistema  se  queda
  32. bloqueado hasta que finaliza el sonido  (como
  33. en avisos de fallos del  sistema;  como Güin-
  34. dous).
  35.   Para ilustrar este tipo de player he prepa-
  36. rado un fichero en C tipo libreria  donde  se
  37. encuentran todas las  funciones  listas  para
  38. ser usadas. Si tienes cualquier  problema  no
  39. dudes en escribirnos, pero creo que todo está 
  40. muy, muy clarito... Una única cosa, si llamas 
  41. a  la   función  *cFPLAY()*cR  cuando   termine  el
  42. sonido se repetirá una y otra vez  hasta  que
  43. llames a *cFSTOP()*cR,  mientras  que si  llamas  a
  44. *cFPLAY_Once()*cR sólo se repetirá una vez.
  45. *cV
  46.         Player mediante DMA
  47. *cR
  48.  Ahora viene la  chicha...  Para  que  no  os
  49. quejeis, el ejemplo más complicado os  lo  he
  50. hecho en assembler para que  no  tengais  que
  51. calentaros la cabeza si no quereis. Se  trata
  52. de un player ya preparado para funcionar  que
  53. está internamente configurado para la  IRQ  7
  54. (aunque no se usa), DMA 1 (muy importante)  y
  55. puerto base 220h. Para cambiar estos  valores
  56. por  defecto,  puedes   editar   el   fichero
  57. *cFplay.inc*cR y  cambiarlos en  la cabecera,  pero
  58. no te aseguro que te vayan a funcionar ya que 
  59. no los he probado en ningún otra  SB  que  no
  60. sea la mia. Seria muy recomendable que imple-
  61. mentases una función para detectar  que puer-
  62. to, DMA y IRQ lleva la SB en el que se ejecu-
  63. tará el player (si no te aclaras enviame  una
  64. e-mail o carta y  veremos  lo  que  se  puede
  65. hacer).
  66.   He dividido el programa en 2 ficheros  para
  67. aislar las funciones de la SB y los datos del 
  68. própio programa. Es de reseñar  la  sencillez
  69. de las 2 funciones que están implementadas en 
  70. el  fichero *cFplay.asm*cR,  tanto  *cFLeeRAW*cR  como la 
  71. principal usan únicamente funciones  del  DOS
  72. (ficheros, memoria y salida) y las  funciones
  73. implementadas en el otro fichero a  excepción
  74. del *cDOUT 20h <- 20h  *cR que, como supondreis, se 
  75. usa para indicar el final de una interrupción 
  76. y que aquí sirve para  resetear  el controla-
  77. dor.
  78.   En el fichero  *cFplay.inc*cR  nos  encontramos
  79. con  funciones   interesantes  como  *cFWriteDSP*cR
  80. con la que se escribe al DSP (digital  signal
  81. procesor)  de la SB o *cFResetSB*cR.  Mírate  estas
  82. funciones ya que no las comentaré  aquí  pues
  83. están sobradamente comentadas en  el  fichero
  84. fuente.
  85.   Vamos a centrarnos en la función *cFPlayBuffer*cR
  86. (observa  que  *cFPlayRAW*cR  lo  único  que  hace 
  87. es llamar a *cFPlayBuffer*cR después de meter  en
  88. DS el segmento almacenado  en  FS,  pero  era
  89. interesante mantener la  función  ya  que  de
  90. cara a ampliar  la  libreria  será  necesario
  91. retocarla). Lo primero que se hace  en *cFPlay-
  92. Buffer*cR es calcular la dirección  física  del
  93. buffer y actualizar las variables usadas para 
  94. controlar el DMA.
  95.   Seguidamente se reprograma  el  controlador
  96. de DMA enviando  los  parámetros  que  habian
  97. sido calculados a partir del canal de  DMA  a
  98. usar. Esta reprogramación termina  cuando  se
  99. envia el comando  de  habilitación  de  canal
  100. DMA. Luego sigue una bifurcación que mira  si
  101. se ha  llamado  anteriormente  a  la  función
  102. (mediante la  variable  "veces")  y  en  caso
  103. negativo ejecuta una série de  ordenes  orien
  104. tadas a la  programación  del  DSP  para  que
  105. acepte el modo  de  reproducción  deseado  (8
  106. bits, mono/stereo).  Luego  se  le  envia  el
  107. número de bytes por segundo a reproducir y se 
  108. hace un acknowledge a la  tarjeta.  Antes  de
  109. esto nos encontramos con un  bucle  que  está
  110. inutilizado (con un punto y coma delante) que 
  111. debia esperar hasta que el puerto de  estatus
  112. del canal DMA que usemos indique la  finaliza
  113. ción (puede que se te cuelgue si le quitas el 
  114. punto y coma).
  115.  
  116.   Como habrás observado  no  es  tan  dificil
  117. programar un reproductor de ficheros de ondas 
  118. mediante pooling ni con el  DMA,  pero  si  a
  119. pesar de  todas  estas  explicaciones  tienes
  120. algún problema, no dudes en hacermelo saber y 
  121. trataré de  despejarte  todas  las  dudas.  A
  122. partir de la base que aquí se ha  presentado,
  123. se puede tratar de hacer  un  reproductor  de
  124. MODs sencillito o un piano  con  las  teclas,
  125. etc. Si consigues programar algo  interesante
  126. envianoslo y lo publicaremos.
  127.  
  128. *cM                                   Navi Dj.
  129.  
  130.